﻿/* ------------CRAZYBUILD----------------
	Tác giả: Trần Đức Huy
	Email: huytd@gamedev.vn
	Bộ source này (cả code lẫn tài nguyên) public cho mọi người xài xả láng
	Nhưng nếu có hảo tâm thì hãy thêm tên của mình vô phần About của game :D
	------------------------------------- */
package{
	import flash.display.Sprite;
	import flash.events.*; 
	import Box2D.Dynamics.*;
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
	
	public class Game extends Sprite {
		public function Game(){
			addEventListener(Event.ADDED_TO_STAGE, Init);
		}
		
		public function createGround():void{
			// Tạo nền đất
			var worldAABB:b2AABB = new b2AABB();
			worldAABB.lowerBound.Set(0, 0);
			worldAABB.upperBound.Set(800, 600);

			var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
			var doSleep:Boolean = true;
			
			m_world = new b2World(worldAABB, gravity, doSleep);
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(0, 15);
			boxDef = new b2PolygonDef();
			boxDef.SetAsBox(100, 0.01);
			boxDef.friction = 1;
			boxDef.density = 0;
			bodyDef.userData = new pGround();
			bodyDef.userData.width = 800; 
			bodyDef.userData.height = 30 * 2 * 3; 
			addChild(bodyDef.userData);
			body = m_world.CreateBody(bodyDef);
			body.CreateShape(boxDef);
			body.SetMassFromShapes();

			bodyDef = new b2BodyDef();
		
		}
		
		public function Init(e:Event):void
		{
			trace("Init");
			createGround();
				addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
				addEventListener(MouseEvent.MOUSE_DOWN, mouse_down);
				addEventListener(MouseEvent.MOUSE_UP, mouse_up);
				addEventListener(MouseEvent.MOUSE_MOVE, mouse_moving);
				stage.addEventListener (KeyboardEvent.KEY_DOWN, keyDownHandler);
				stage.addEventListener (KeyboardEvent.KEY_UP, keyUpHandler);
				
		}

		public function Update(e:Event):void{
			//trace("Running");
			m_world.Step(m_timeStep, m_iterations);
			
			//Lấy tọa độ chuột và chuyển thành tọa độ của world
			// phyScale là giá trị chỉ tỉ lệ giữa tọa độ thực và tọa độ trong world vật lý
			// tọa độ world vật lý = tọa độ thực / 30    (phyScale = 30)
			mX = mouseX/mPhysScale;
			mY = mouseY/mPhysScale;

			for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){
				if (bb.m_userData is Sprite){
					bb.m_userData.x = bb.GetPosition().x * 30;
					bb.m_userData.y = bb.GetPosition().y * 30;
					bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
				}
			}
		}

		function keyDownHandler (e:KeyboardEvent):void {
			//Sự kiện phím nhấn xuống
			trace("Key code: " + e.keyCode)
			if (e.keyCode == 49) //Nhấn phím số 1
			{
				//drawObj để cho biết đối tượng nào sẽ được vẽ ra (khối vuông hay khối tròn)
				drawObj = 1;
			}
		}
		
		function keyUpHandler (e:KeyboardEvent):void {
			//Sự kiện nhả phím ra
		}

		function mouse_moving(e:MouseEvent):void
		{
			//Sự kiện chuột di chuyển trong stage
		}
		
		function mouse_down(e:MouseEvent):void
		{
			//Sự kiện chuột nhấn xuống
			Main.sc += 1; //Tăng điểm lên
			if (drawObj==1) //Thêm khối vuông
			{
				bodyDef.position.x = mX;
				bodyDef.position.y = mY;
				rX = Math.random() + 0.5;
				rX2 = Math.random() + 1;
				rY = Math.random() + 0.5;
					
				boxDef = new b2PolygonDef();
					boxDef.SetAsBox(rX, rY);
					
					boxDef.density = 1.0;
					boxDef.friction = 0.5;
					boxDef.restitution = 0.2;
					bodyDef.userData = new pBox();
					bodyDef.userData.width = rX * 2 * 30; 
					bodyDef.userData.height = rY * 2 * 30; 
					body = m_world.CreateBody(bodyDef);
					body.CreateShape(boxDef);
				body.SetMassFromShapes();
				addChild(bodyDef.userData);
			}
			if (drawObj==2) //Thêm khối tròn
			{
				bodyDef.position.x = mX;
				bodyDef.position.y = mY;
				rX2 = Math.random() + 1;
					
				circleDef = new b2CircleDef();
					circleDef.radius = rX2;
					circleDef.density = 2.0;
					circleDef.friction = 1.5;
					circleDef.restitution = 0.5
					bodyDef.userData = new pCir();
					bodyDef.userData.width = rX2 * 2 * 30; 
					bodyDef.userData.height = rX2 * 2 * 30; 
					body = m_world.CreateBody(bodyDef);
					body.CreateShape(circleDef);
				body.SetMassFromShapes();
				addChild(bodyDef.userData);
			}
		}

		function mouse_up(e:MouseEvent):void
		{
			//Sự kiện nhả chuột
		} 
		
		var wX:Number;
		var wY:Number;
		var mX:Number;
		var mY:Number;
		var rX:Number;
		var rX2:Number;
		var rY:Number;
		public var drawObj:int;
		public var body:b2Body;
		public var bodyList:b2Body;
		public var bodyDef:b2BodyDef;
		public var boxDef:b2PolygonDef;
		public var circleDef:b2CircleDef;
		public var m_world:b2World;
		public var m_iterations:int = 10;
		public var m_timeStep:Number = 1.0/30.0;
		public var mPhysScale:int = 30;

}
}